// Copyright 2011 George Cook
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#import "InjectiveContainer.h"

#import "InjectiveObjectDescription.h"
#import "InjectivePropertyDescription.h"

#import "InjectiveFactory.h"

#import "InjectiveCache.h"
#import "InjectiveSingletonCache.h"
#import "InjectiveMacros.h"

@interface Injective : NSObject {
	InjectiveContainer *_container;
}

@property (retain, readonly) InjectiveContainer *container;
@property (readonly) Injective *context;

+ (Injective *) context;
+ (id)getObject:(id)component;
+ (id)getObjectByID:(NSString *)ID;
+ (void)wireInstance:(id)instance;
+ (void) clearContext;  //Supports unit testing... Only call this if you know what you're doing!
+ (void) addInstance:(id)instance; //mainly for unit testing, but you might find uses for it.
+ (void) addInstance:(id)instance forType:(id) type; //mainly for unit testing, but you might find uses for it.
+ (void) initializeAutoInitializeIntances; //will automatically create any singletons that have an autoinitiazle flag

- (id)getObject:(id)component;
- (void)wireInstance:(id)instance;
- (BOOL)loadXMLConfig:(NSString *) fileName;
- (BOOL)loadXMLConfigWithOverrides:(NSString *) fileName; //use this to load a config file that will replace elements
//froma previous load. This can aid unit testing. Will only work for elements with ids
- (BOOL) addObjectsToContext: (NSArray *) objects;
- (BOOL) addObjectsToContext: (NSArray *) objects overridesIfIdsAreTheSame:(BOOL) isOverriden;

@end